<?php
namespace app\admin\controller;




class Version
{

    /**
     * 更新
     */
    public function index()
    {
        $protocol = (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $domainName = $_SERVER['HTTP_HOST'];
        $ConfigModel = new \app\home\model\Config();
        $data2 = array(
            "rjbs" => "shop_dl",
            "yuming" => $protocol . $domainName,
            "version" => $ConfigModel->getConfigValue("site_version")
        );

        $appid = $ConfigModel->getConfigValue("site_appid");
        $result = $this->master_api("https://c5.weijuyunke.com/api/SoftwareApi/software", $data2, $appid);
        $jsonData = json_decode($result, true);
        if ($jsonData['code'] === 200) {
            $filePath = $jsonData["data"]["renew_catalogue"];
            // 定义打包文件夹，没有就创建
            $needZipPath = './tempzip/';
            if (! is_dir($needZipPath)) {
                @mkdir($needZipPath, 0755);
            }
            // 根据斜杆分割,获取最后一个值(zip的名称)
            // $filename = substr($filePath, strrpos($filePath, '/') + 1);
            $filename = app()->getRootPath() . "public/tempzip/" . basename($filePath);
            // 从服务器下载zip包
            $this->curl_download($filePath, $filename);
            $zip = new \ZipArchive();
            // 打开一个zip
            $res = $zip->open($filename);
            
            $upload_url = app()->getRootPath();
            if ($res === TRUE) {
                $files = array();
                for ($i = 0; $i < $zip->numFiles; $i ++) {
                    $file = $zip->getNameIndex($i);
                    $extension = pathinfo($filename, PATHINFO_EXTENSION);
                    if ($file != 'config/database.php' && $file != 'public/.user.ini' &&  $file != '.env'&& $extension != 'pem') {
                        $files[] = $file;
                    }
                }
                
                // 解压到指定目录
                $zip->extractTo($upload_url, $files);
                $zip->close();
                
                if (file_exists($filename)) {
                    unlink($filename);
                }

                // 修改为自己的路径
                $_sqlFile = APP_PATH.'/install/updateSql.php';;
                if (is_file($_sqlFile)) {
                     require_once APP_PATH.'/install/updateSql.php';
                }
                $version = $jsonData["data"]["version_number"];
                $ConfigModel->where("key", "site_version")->update([
                    'value' => $version
                ]);
                echo json_encode([
                    "code" => 0,
                    "message" => '更新成功',
                    "data" => []
                ]);
            } else {
                
                echo json_encode([
                    "code" => 1,
                    "message" => '解压失败' . $filename,
                    "data" => []
                ]);
            }
            @rmdir($needZipPath);
        } else {
            
            echo json_encode([
                "code" => 1,
                "message" => $jsonData['msg'],
                "data" => []
            ]);
        }
    }

    /**
     * 请求授权
     */
    public function pirate()
    {
        $c5_authorization = \app\home\model\Config::getConfigValue('c5_authorization');
        if ($c5_authorization){
            return adminSuccess('已授权');
        }
        $protocol = (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $domainName = $_SERVER['HTTP_HOST'];
        
        $domain = $protocol . $domainName;

        $url = "https://c5.weijuyunke.com/api/softwareApi/pirate";
        $data = array(
            'rjbs' => 'shop_dl',
            'yuming' => $domain
        );
        $result = json_decode($this->post($url, $data), true);

        if ($result['code'] == 200){
            return adminSuccess('授权成功');
        }else{
            return adminError('授权失败');
        }
    }

    /**
     * 查询是否有新版本
     */
    public function isNew()
    {
        $protocol = (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $domainName = $_SERVER['HTTP_HOST'];
        $domain = $protocol . $domainName;
        $url = "https://c5.weijuyunke.com/api/softwareApi/newest_version";
        $ConfigModel = new \app\home\model\Config();
        $data = array(
            'rjbs' => 'shop_dl',
            'appid' => $ConfigModel->getConfigValue("site_appid"),
            'version' => $ConfigModel->getConfigValue("site_version"),
            'yuming' => $domain
        );

        $result = json_decode($this->post($url, $data), true);
        $flag = 0;
        if ($result['code'] == '200') {
            $flag = 1;
        }
       return  adminSuccess('版本更新',['flag' => $flag]);
    }

    /**
     * 获取版本列表
     */
    public function versionList()
    {
        $appid = \app\home\model\Config::getConfigValue("site_appid");
        
        if ($appid) {
            
            $data2 = array(
                "rjbs" => "shop_dl",
                "appid" => $appid
            );
            $result = $this->master_api("https://c5.weijuyunke.com/api/SoftwareApi/versionLog", $data2, $appid);
            
            $jsonData = json_decode($result, true);
            
            if ($jsonData['code'] === 200) {
                return  adminSuccess('版本信息',$jsonData['data']);
            } else {
                return adminSuccess('版本信息');
            }
        } else {
            return adminSuccess('版本信息');
        }
    }

    function master_api($uri, $data, $appid)
    {
        $request = 'post'; // 接口请求方式 (get/post)
        
        $data['appid'] = $appid;
        
        $key = "wjyk1411182200"; // 提供的接口ACCESS_KEY
        
        $data['sign'] = $this->createMasterApiSign($uri, $data, $key); // 生成动态签名sign
        
        $url = $uri . '?appid=' . $appid . '&sign=' . $data['sign'] . ''; // 调用接口 $uri接口名
        
        $result = $this->$request($url, $data);
        return $result;
    }

    /**
     * 生成签名结果
     *
     * $uri 调用接口方法的url
     *
     * $data 接口接收到的数组
     *
     * $accesskey 提供的接口ACCESS_KEY
     */
    function createMasterApiSign($uri, $data, $accesskey)
    {
        /* 数组排序 */
        ksort($data);
        reset($data);
        $arg = $this->createQueryString($data);
        $sign = md5($uri . '&' . $arg . $accesskey);
        return $sign;
    }

    function createQueryString($data)
    {
        $arg = "";
        foreach ($data as $key => $value) {
            $arg .= $key . "=" . $value . "&";
        }
        $arg = substr($arg, 0, - 1); // 去掉最后一个&字符
        return $arg;
    }

    function get($url, $data = '', $cookie = '')
    {
        if ($data)
            $url = $url . '?' . $this->createQueryString($data);
        
        $curl = curl_init($url);
        // 不显示header信息
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 将 curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 使用自动跳转
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        if (! empty($cookie)) {
            // 包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。
            curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
        }
        // 自动设置Referer
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        $result = curl_exec($curl);
        // 推断curl请求是否超时
        if (curl_errno($curl)) {
            $result = file_get_contents($url);
        }
        curl_close($curl);
        return $result;
    }

    function post($url, $params, $cookie = '')
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 对认证证书来源的检查，0表示阻止对证书的合法性的检查。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        // 从证书中检查SSL加密算法是否存在
        // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
        // 模拟用户使用的浏览器，在HTTP请求中包含一个”user-agent”头的字符串。
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        // 发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。
        curl_setopt($curl, CURLOPT_POST, 1);
        // 将 curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 使用自动跳转
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        // 自动设置Referer
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        // Cookie地址
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
        // 全部数据使用HTTP协议中的"POST"操作来发送。要发送文件，
        // 在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串
        // 类似'para1=val1¶2=val2&...'或使用一个以字段名为键值，字段数据为值的数组
        // 如果value是一个数组，Content-Type头将会被设置成multipart/form-data。
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
        $result = curl_exec($curl);
        // 推断curl请求是否超时
        if (curl_errno($curl)) {
            $result = file_get_contents($url);
        }
        curl_close($curl);
        return $result;
    }

    function curl_download($url, $dir)
    {
        $ch = curl_init($url);
        $fp = fopen($dir, "wb");
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $res = curl_exec($ch);
        curl_close($ch);
        fclose($fp);
        return $res;
    }

    /**
     * 获取文件内容
     *
     * @param $url 要获取的url            
     * @return res 成功返回内容 失败返回false
     */
    public function get_file($url)
    {
        if (trim($url) == '') {
            return false;
        }
        $opts = array(
            'http' => array(
                'method' => "GET",
                'timeout' => 3
            )
        ); // 单位秒
        
        $cnt = 0;
        while ($cnt < 3 && ($res = @file_get_contents($url, false, stream_context_create($opts))) === FALSE)
            $cnt ++;
        if ($res === false) {
            return false;
        } else {
            return $res;
        }
    }
}